package com.hsurosy.hsuchain.nft.datasource.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

/**
 * MyBatis Plus 元数据对象处理器
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-04 19:14
 * @Description
 * @Version: v1.0.0
 */
public class DataObjectHandler implements MetaObjectHandler {

    /**
     * 插入操作时自动填充字段
     *
     * @param metaObject MetaObject 反射类，封装了实体对象的元数据
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 如果创建时间为空，则自动填充当前时间
        this.setFieldValByNameIfNull("gmtCreate", new Date(), metaObject);

        // 如果修改时间为空，则自动填充当前时间
        this.setFieldValByNameIfNull("gmtModified", new Date(), metaObject);

        // 自动填充逻辑删除字段，默认未删除
        this.setFieldValByName("deleted", 0, metaObject);

        // 自动填充乐观锁版本号，默认版本号为0
        this.setFieldValByName("lockVersion", 0, metaObject);
    }

    /**
     * 设置字段值，如果字段当前为空则填充值
     *
     * @param fieldName  字段名称
     * @param fieldVal   字段值
     * @param metaObject MetaObject 元对象，用于反射操作
     */
    private void setFieldValByNameIfNull(String fieldName, Object fieldVal, MetaObject metaObject) {
        if (metaObject.getValue(fieldName) == null) {
            this.setFieldValByName(fieldName, fieldVal, metaObject);
        }
    }

    /**
     * 更新操作时自动填充修改时间字段
     *
     * @param metaObject MetaObject 反射类，封装了实体对象的元数据
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 自动更新修改时间为当前时间
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}
